home *** CD-ROM | disk | FTP | other *** search
- /*
- ** $Filename: net/if.h $
- ** $Release$
- ** $Revision: 3.1 $
- ** $Date: 1994/02/03 11:56:05 $
- **
- ** Network interface
- **
- ** Copyright © 1993,1994 AmiTCP/IP Group, <AmiTCP-Group@hut.fi>
- ** Helsinki University of Technology, Finland.
- ** All rights reserved.
- */
-
- /*
- * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)if.h 7.11 (Berkeley) 3/19/91
- */
-
- /*
- * Structures defining a network interface, providing a packet
- * transport mechanism (ala level 0 of the PUP protocols).
- *
- * Each interface accepts output datagrams of a specified maximum
- * length, and provides higher level routines with input datagrams
- * received from its medium.
- *
- * Output occurs when the routine if_output is called, with three parameters:
- * (*ifp->if_output)(ifp, m, dst)
- * Here m is the mbuf chain to be sent and dst is the destination address.
- * The output routine encapsulates the supplied datagram if necessary,
- * and then transmits it on its medium.
- *
- * On input, each interface unwraps the data received by it, and either
- * places it on the input queue of a internetwork datagram routine
- * and posts the associated software interrupt, or passes the datagram to a raw
- * packet input routine.
- *
- * Routines exist for locating interfaces by their addresses
- * or for locating a interface on a certain network, as well as more general
- * routing and gateway routines maintaining information used to locate
- * interfaces. These routines live in the files if.c and route.c
- */
-
- //MODULE 'sys/time'
-
-
- /*
- * Structure defining a queue for a network interface.
- *
- * (Would like to call this struct ``if'', but C isn't PL/1.)
- */
-
- OBJECT ifqueue
- ifq_head:PTR TO mbuf,
- ifq_tail:PTR TO mbuf,
- ifq_len:LONG,
- ifq_maxlen:LONG,
- ifq_drops:LONG
-
-
- OBJECT ifnet
- if_name:PTR TO BYTE, /* name, e.g. ``en'' or ``lo'' */
- if_unit:WORD, /* sub-unit for lower level driver */
- if_mtu:WORD, /* maximum transmission unit */
- if_flags:WORD, /* up/down, broadcast, etc. */
- if_timer:WORD, /* time 'til if_watchdog called */
- if_metric:LONG, /* routing metric (external only) */
- if_addrlist:PTR TO ifaddr, /* linked list of addresses per if */
- if_snd:PTR TO ifqueue, /* output queue */
- /* procedure handles */
- if_init:LONG, /* init routine */
- if_output:LONG, /* output routine (enqueue) */
- if_start:LONG, /* initiate output routine */
- if_done:LONG, /* output complete routine */
- if_ioctl:LONG, /* ioctl routine */
- if_reset:LONG, /* bus reset routine */
- if_watchdog:LONG, /* timer routine */
- /* generic interface statistics */
- if_ipackets:LONG, /* packets received on interface */
- if_ierrors:LONG, /* input errors on interface */
- if_opackets:LONG, /* packets sent on interface */
- if_oerrors:LONG, /* output errors on interface */
- if_collisions:LONG, /* collisions on csma interfaces */
- /* end statistics */
- if_next:PTR TO ifnet,
- if_type:UBYTE, /* ethernet, tokenring, etc */
- if_addrlen:UBYTE, /* media address length */
- if_hdrlen:UBYTE, /* media header length */
- if_index:UBYTE, /* numeric abbreviation for this if */
- /* more statistics here to avoid recompiling netstat */
- if_lastchange:TimeVal, /* last updated */
- if_ibytes:LONG, /* total number of octets received */
- if_obytes:LONG, /* total number of octets sent */
- if_imcasts:LONG, /* packets received via multicast */
- if_omcasts:LONG, /* packets sent via multicast */
- if_iqdrops:LONG, /* dropped on input, this interface */
- if_noproto:LONG, /* destined for unsupported protocol */
- if_baudrate:LONG, /* linespeed */
- if_pcount:LONG /* number of promiscuous listeners */
-
-
- /*
- * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1)
- * input routines have queues of messages stored on ifqueue structures
- * (defined above). Entries are added to and deleted from these structures
- * by these macros, which should be called with ipl raised to splimp().
- */
- #define IF_QFULL(ifq) ((ifq).ifq_len >= (ifq).ifq_maxlen)
- #define IF_DROP(ifq) ((ifq).ifq_drops++)
-
- /* --- must convert ---
- #define IF_ENQUEUE(ifq, m) { \
- (m)->m_nextpkt = 0; \
- if ((ifq)->ifq_tail == 0) \
- (ifq)->ifq_head = m; \
- else \
- (ifq)->ifq_tail->m_nextpkt = m; \
- (ifq)->ifq_tail = m; \
- (ifq)->ifq_len++; \
- }
- #define IF_PREPEND(ifq, m) { \
- (m)->m_nextpkt = (ifq)->ifq_head; \
- if ((ifq)->ifq_tail == 0) \
- (ifq)->ifq_tail = (m); \
- (ifq)->ifq_head = (m); \
- (ifq)->ifq_len++; \
- }
- #define IF_DEQUEUE(ifq, m) { \
- (m) = (ifq)->ifq_head; \
- if (m) { \
- if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \
- (ifq)->ifq_tail = 0; \
- (m)->m_nextpkt = 0; \
- (ifq)->ifq_len--; \
- } \
- }
- */
-
- #define IFQ_MAXLEN 50
- #define IFNET_SLOWHZ 1 /* granularity is 1 second */
-
- #endif /* KERNEL */
-
- #define IFF_UP $1 /* interface is up */
- #define IFF_BROADCAST $2 /* broadcast address valid */
- #define IFF_DEBUG $4 /* turn on debugging */
- #define IFF_LOOPBACK $8 /* is a loopback net */
- #define IFF_POINTOPOINT $10 /* interface is point-to-point link */
- #define IFF_NOTRAILERS $20 /* avoid use of trailers */
- #define IFF_RUNNING $40 /* resources allocated */
- #define IFF_NOARP $80 /* no address resolution protocol */
- #define IFF_SIMPLEX $800 /* can't hear own transmissions */
-
- /* next two not supported now, but reserved: */
- #define IFF_PROMISC $100 /* receive all packets */
- #define IFF_ALLMULTI $200 /* receive all multicast packets */
- #define IFF_OACTIVE $400 /* transmission in progress */
-
- /* flags set internally only: */
- #define IFF_CANTCHANGE \
- (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|IFF_SIMPLEX)
-
- /*
- * The ifaddr structure contains information about one address
- * of an interface. They are maintained by the different address families,
- * are allocated and attached when an address is set, and are linked
- * together so all addresses for an interface can be located.
- */
- OBJECT ifaddr
- ifa_addr:PTR TO sockaddr, /* address of interface */
- ifa_dstaddr:PTR TO sockaddr, /* other end of p-to-p link */
- ifa_netmask:PTR TO sockaddr, /* used to determine subnet */
- ifa_ifp:PTR TO ifnet, /* back-pointer to interface */
- ifa_next:PTR TO ifaddr, /* next address for interface */
- ifa_rtrequest:LONG, /* check or clean routes (+ or -)'d */
- ifa_rt:PTR TO rtentry, /* ??? for ROUTETOIF */
- ifa_flags:UWORD, /* mostly rt_flags for cloning */
- ifa_llinfolen:UWORD /* extra to malloc for link info */
-
-
- #define IFA_ROUTE RTF_UP /* route installed */
-
-
- /*
- * Interface request structure used for socket
- * ioctl's. All interface ioctl's must have parameter
- * definitions which begin with ifr_name. The
- * remainder may be interface specific.
- */
- #define IFNAMSIZ 16
-
- OBJECT ifreq
- ifr_name[16]:BYTE, /* if name, e.g. "en0" */
- [CUNION
- ifru_addr:sockaddr,
- ifru_dstaddr:sockaddr,
- ifru_broadaddr:sockaddr,
- ifru_flags:WORD,
- ifru_metric:LONG,
- ifru_data:PTR TO BYTE
- ENDUNION]:ifr_ifru
-
- #define ifr_addr ifr_ifru.ifru_addr /* address */
- #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
- #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
- #define ifr_flags ifr_ifru.ifru_flags /* flags */
- #define ifr_metric ifr_ifru.ifru_metric /* metric */
- #define ifr_data ifr_ifru.ifru_data /* for use by interface */
-
- OBJECT ifaliasreq
- ifra_name[16]:BYTE, /* if name, e.g. "en0" */
- ifra_addr:sockaddr,
- ifra_broadaddr:sockaddr,
- ifra_mask:sockaddr
-
-
- /*
- * Structure used in SIOCGIFCONF request.
- * Used to retrieve interface configuration
- * for machine (useful for programs which
- * must know all networks accessible).
- */
- OBJECT ifconf
- ifc_len:LONG, /* size of associated buffer */
- [CUNION
- ifcu_buf:PTR TO BYTE,
- ifcu_req:PTR TO ifreq
- ENDUNION]:ifc_ifcu
-
- #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
- #define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */
-
-
-
-